package com.deer.wms.inventory.service;




import com.deer.wms.inventory.model.Inventory.*;
import com.deer.wms.inventory.model.stockTake.StockTakeMaster;
import com.deer.wms.inventory.model.stockTake.StockTakeTaskDto;
import com.deer.wms.project.root.service.SuperService;

import java.util.List;


/**
 *
 * @author 郭靖勋
 * @since 2019/12/18
 */
public interface InventoryService extends SuperService<Inventory> {
    /**
     * 按照条件查找满足条件的库存
     * @param criteria 条件
     * @return List<InventoryDto>
     */
    List<InventoryDto> findList(InventoryCriteria criteria);

    /**
     * 根据库位分组查询
     * @return
     */

    List<InventoryDto> findGroupList(InventoryCriteria criteria);

    /**
     * 按条件查询相同库存
     * @param wareId 仓库
     * @param cellCode 库位
     * @param boxCode 箱码
     * @param packDetailId 包装
     * @param itemCode 物料
     * @param batchId 批次
     * @param transRatio 转换率
     * @param batchName
     * @return Inventory
     */
    Inventory getSameInventory(Integer wareId, String cellCode, String boxCode, Integer packDetailId, String itemCode, Integer batchId, Double transRatio
          ,String  batchName

        );

    /**
     * 按条件查询相同库存
     * @param wareId 仓库
     * @param cellCode 库位
     * @param boxCode 箱码
     * @param packDetailId 包装
     * @param itemCode 物料
     * @param batchName 批次
     * @param transRatio 转换率
     * @return Inventory
     */
    Inventory getSameInventoryNew(Integer wareId, String cellCode, String boxCode, Integer packDetailId, String itemCode, String batchName, Double transRatio);
    /**
     * 获取收货区库存
     * @param inventoryId 库存ID
     * @param wareId 仓库ID
     * @return Inventory
     */
    Inventory  getAccept(Integer inventoryId,Integer wareId);

    Inventory  getAsnInventory(Integer wareId,String boxCode,Integer packDetailId,String itemCode,Integer batchId);

    List<InventoryDto> findByCellUseType(InventoryCriteria criteria);

    List<InventorySelectDto> findByInventoryId(InventoryCriteria criteria);

    /**
     * 根据条件查询可出库库存
     * @param criteria 条件
     * @return List<InventorySelectDto>
     */
    List<InventorySelectDto> findCanBeOutOfStock(InventoryCriteria criteria);

    List<InventorySelectDto> findCanBeOutOfIds(InventoryCriteria criteria);

    List<InventoryDto> canOut(InventoryCriteria criteria);

    List<Inventory> getStockInventory(Integer wareId,String cellCode,String boxCode,Integer organizationId,String itemCode);

    List<Inventory> findSame(InventoryCriteria criteria);

    List<Inventory> findByCellCode(InventoryCriteria criteria);

    List<Inventory> findByCellCodeAndState(InventoryCriteria criteria);

    List<Inventory> checkList(InventoryCriteria criteria);
    List<Inventory> findBaoKuan(Integer wareId);

    List<Inventory>findBatchInventory(InventoryCriteria criteria);

    Inventory findBatchId(Integer batchId);

     Inventory findByItemWareOrg(String itemCode,Integer wareId,Integer orgId,String toCellCode);




    Double findByItemWareOrgGroupByItem(Integer wareId,Integer orgId,String itemCode);


    List inventorySafetyList(InventoryCriteria criteria);

    List<Inventory> palletsToCombine(InventoryCriteria criteria);

    List<Inventory> inventoriesWithBoxCode(String boxCode);

    List<GroupByWareOrgItem> findGroupByWareOrgItem(InventoryCriteria criteria);

    String findSameItemCell(String itemCode,Integer wareId,Integer orgId);

    /**
     * 按单出库
     * @param billNo 单据号
     * @param wareId 仓库id
     */
    void sendOut(String billNo,Integer wareId);

    void cellState(String cellCode,Integer wareId);

    List<Inventory> getInventoryByFromInfo(StockTakeMaster stockTakeMaster);

    Inventory findBy(String field, Integer value);

    List<Inventory> findListByField(String field, String value);

    /**
     * 获取容器箱库存
     * @param boxCode 箱码
     * @return List<Inventory>
     */
    List<Inventory> getBoxStock(String boxCode);

    /**
     * 获取库位上的容器数量
     * @param cellCode
     * @return
     */
    Integer getBoxNumInCell(String cellCode);

    List<Inventory> selectItemByCodes(String cellCode, String boxCode);

    void updateInOrOut(Integer wareId, String itemCode, Double residualQuantity, String in);

    List<Inventory> SelectList();


    /**
     * 获取所有数量
     * @return
     */
    long getTotal();

    List<Inventory> orderList(InventoryCriteria criteria);


    /**
     *
     * @param srcBoxCode
     * @param itemCode
     * @return
     */
    Integer findBySrcCode(String srcBoxCode,String itemCode);

    List<InventoryDto> soList(InventoryCriteria criteria);



    void updateBath(List<Inventory> collect);


    /**
     * VMI物料查询
     * @param criteria
     * @return
     */
    List<InventoryDto> vmiList(InventoryCriteria criteria);

    long findCount(InventoryCriteria criteria);

    void updateBatch();


    /**
     *
     * @param inventoryId
     * @return
     */
    List<InventorySelectDto> findebyId(Integer inventoryId);

    InventorySelectDto findbyInv(String allotDetailNo);

    /**
     * 导出表格
     * @param criteria
     * @return
     */
    List<InventoryExcel> dowLoadList(InventoryCriteria criteria);
}
